Mô đun:SMW
Module:SMW local p = {} local concat local dump local print local getArgs = require('Module:Arguments').getArgs -- Return results function p.ask(frame) if not mw.smw then return "mw.smw module not found" end if frame.args1 nil then return "no parameter found" end local queryResult = mw.smw.ask( frame.args ) if queryResult nil then return "(no values)" end if type( queryResult ) "table" then return ' ' .. dump(queryResult) .. ' ' end return queryResult end function p.getQueryResult(frame) if not mw.smw then return "mw.smw module not found" end if frame.args1 nil then return "no parameter found" else queryResult = mw.smw.getQueryResult( frame.args ) end if queryResult nil then return "(no values)" end return ' ' .. dump(queryResult) .. ' ' end -- Return property type function p.getPropertyType(frame) if not mw.smw then return "mw.smw module not found" end if frame.args1 nil then return "no parameter found" else type = mw.smw.getPropertyType( frame.args1 ) end if type nil then return "(no values)" end return type end -- set with return results function p.set( frame ) if not mw.smw then -- return "mw.smw module not found" return end local result = mw.smw.set( frame.args ) if result true then -- return 'Your data was stored successfully' return else -- return 'An error occurred during the storage process. Message reads ' .. result.error return end end function p.subobject( frame ) if not mw.smw then return "mw.smw module not found" end local args = getArgs(frame) local subobjectId if args.subobjectId or args.SubobjectId then subobjectId = args.subobjectId or args.SubobjectId args.subobjectId = nil args.SubobjectId = nil end local result = mw.smw.subobject( args, subobjectId ) if result true then return 'Your data was stored successfully in a subobject\n ' .. mw.dumpObject(args) .. ' ' else return 'An error occurred during the subobject storage process. Message reads ' .. result.error end end function p.info( frame ) if not mw.smw then return "mw.smw module not found" end if frame.args1 nil then return "no parameter found" end return mw.smw.info( frame.args1, frame.args2 ) end --- Concatenates a variable number of strings and numbers to one single string -- ignores tables, bools, functions, and such and replaces them with the empty string -- -- What is the benefit of using variable.concat instead of the .. operator? -- Answer: .. throws an error, when trying to concat bools, tables, functions, etc. -- This here handels them by converting them to an empty string -- -- @param ... varaibles to concatenate -- -- @return string concat = function(...) local args = {...} if #args 0 then error('you must supply at least one argument to \'concat\' (got none)') end local firstArg = table.remove(args, 1) if type(firstArg) 'string' or type(firstArg) 'number' then firstArg = print(firstArg) else firstArg = '' end if #args 0 then return firstArg else return firstArg .. concat(unpack(args)) end end --- This dumps the variable (converts it into a string representation of itself) -- -- @param entity mixed, value to dump -- @param indent string, can bu used to set an indentation -- @param omitType bool, set to true to omit the () in front of the value -- -- @return string dump = function(entity, indent, omitType) local entity = entity local indent = indent and indent or '' local omitType = omitType if type( entity ) 'table' then local subtable if not omitType then subtable = '(table).. #entity .. ':' end indent = indent .. '\t' for k, v in pairs( entity ) do subtable = concat(subtable, '\n', indent, k, ': ', dump(v, indent, omitType)) end return subtable elseif type( entity ) 'nil' or type( entity ) 'function' or type( entity ) 'boolean' then return ( not omitType and '(' .. type(entity) .. ') ' or '' ) .. print(entity) elseif type( entity ) 'string' then entity = mw.ustring.gsub(mw.ustring.gsub(entity, "\\'", "'"), "'", "\\'") return concat(omitType or '(string) ', '\'', entity, '\'') else -- number value expected return concat(omitType or '(' .. type( entity ) .. ') ', entity) end end --- This function prints a variable depending on its type: -- * tables get concatenated by a comma -- * bools get printed as true or false -- * strings and numbers get simple returned as string -- * functions and nils return as emtpy string -- @return string print = function(v) if type( v ) 'table' then return table.concat(v, ',') elseif type( v ) 'boolean' then return ( v and 'true' or 'false' ) elseif type(v) 'string' or type(v) 'number' then return tostring(v) else return '' end end return p